package org.aplombh.java.awcing.basic.struct.hash;

import java.util.Scanner;

/**
 * 给定一个长度为 n 的字符串，再给定 m 个询问，每个询问包含四个整数 l1,r1,l2,r2，请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。
 * <p>
 * 字符串中只包含大小写英文字母和数字。
 * <p>
 * 输入格式
 * 第一行包含整数 n 和 m，表示字符串长度和询问次数。
 * <p>
 * 第二行包含一个长度为 n 的字符串，字符串中只包含大小写英文字母和数字。
 * <p>
 * 接下来 m 行，每行包含四个整数 l1,r1,l2,r2，表示一次询问所涉及的两个区间。
 * <p>
 * 注意，字符串的位置从 1 开始编号。
 * <p>
 * 输出格式
 * 对于每个询问输出一个结果，如果两个字符串子串完全相同则输出 Yes，否则输出 No。
 * <p>
 * 每个结果占一行。
 * <p>
 * 数据范围
 * 1≤n,m≤10^5
 * 输入样例：
 * 8 3
 * aabbaabb
 * 1 3 5 7
 * 1 3 6 8
 * 1 2 1 2
 * 输出样例：
 * Yes
 * No
 * Yes
 */
public class StringHash_841 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        String str = scanner.next();

        StringHash stringHash = new StringHash(str);

        while (m-- != 0) {
            int l1 = scanner.nextInt();
            int r1 = scanner.nextInt();
            int l2 = scanner.nextInt();
            int r2 = scanner.nextInt();

            if (stringHash.get(l1, r1) == stringHash.get(l2, r2)) System.out.println("Yes");
            else System.out.println("No");

        }
    }
}

// 字符串哈希，通过一个指数递增的数组，实现每段对应计算出的hash值相同
// 把整个字符串当作一个p进制数
class StringHash {
    public static final int N = 100010;
    // 经验：131 13331
    public static final int P = 131;

    long[] hash;
    long[] p;

    private void init() {
        hash = new long[N];
        p = new long[N];
        p[0] = 1;
    }

    public StringHash(String str) {
        init();

        for (int i = 1; i <= str.length(); i++) {

            // 指数递增的数组
            // 每位的进制
            p[i] = p[i - 1] * P;

            // 每次乘p 并且加上当前字符的ASCII码的值
            // hash[i] 存放0-i 当作p进制数的值
            hash[i] = hash[i - 1] * P + str.charAt(i - 1);
        }
    }


    long get(int l, int r) {

        // 字符串 abcdefg..  ->  1234567...
        // h[r] = 0-r           1234567                 当作p(十进制）进制数，整个数的值
        // h[l] = 0-l             12345                 当作p(十进制）进制数，整个数的值
        // h[l-1] = 0-(l-1)        1234                 当作p(十进制）进制数，整个数的值
        // h[l-1] * p[r-l+1] =  1234000
        // 所以 h[l-r] = h[r] - h[l-1] * p[r-l+1] = 1234567 - 1234000 = 567
        return hash[r] - hash[l - 1] * p[r - l + 1];
    }
}





























